package com.sasu.university_data.controller.after;

import com.sasu.university_data.dto.Pwd;
import com.sasu.university_data.dto.UpdateUserDto;
import com.sasu.university_data.entity.User;
import com.sasu.university_data.service.UserService;
import com.sasu.university_data.util.Md5Utils;
import com.sasu.university_data.util.Resp;
import com.sasu.university_data.util.ResponseCode;
import com.sasu.university_data.util.ResponseData;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

@Api(tags = "用户功能接口")
@RestController
@RequestMapping("/user")
public class UserController {

    @Resource
    private UserService userService;

    /**
     * 用户注册
     *
     * @param user 使用者
     * @return {@link Integer }
     * @author qionglan
     * @date 2024/06/13 14:45:13
     **/

    @PostMapping("/register")
    @ApiOperation("用户注册")
    public Integer register( @RequestBody User user, HttpSession session){
        Integer status = userService.addUser(user);
        if (status==603){
            session.setAttribute("username",user.getUsername());
        }
        return status;
    }

    /**
     * 用户登录
     *
     * @param user 使用者
     * @return {@link Integer }
     * @author qionglan
     * @date 2024/06/13 14:45:13
     **/

    @RequestMapping("/login")
    @ApiOperation("用户登录")
    public Integer login(@RequestBody User user, HttpSession session){
        Integer status = userService.login(user);
        /*
         * session:服务器端的小型容器，在项目运行期间可以使用其存储一些数据，
         * 一旦服务器停止，数据就不会存在。
         * session在项目中是通用的，一次存值，处处可用。
         * 数据默认保存7天。
         * */
        if (status==200){
            session.setAttribute("username",user.getUsername());
        }

        //System.out.println(status);

        return status;
    }

    /**
     * 获取登录用户名
     *
     * @param session 一场
     * @return {@link User }
     * @author qionglan
     * @date 2024/06/14 09:38:14
     **/

    @RequestMapping("/getUsername")
    @ApiOperation("获取登录用户名")
    public User showUsername(HttpSession session){
        String username = (String) session.getAttribute("username");
        User user=new User();
        user.setUsername(username);
        return user;
    }

    /**
     * 修改密码
     *
     * @param pwd     pwd
     * @param session 一场
     * @return {@link Integer }
     * @author qionglan
     * @date 2024/06/14 09:39:14
     **/

    @RequestMapping("/changePassword")
    @ApiOperation("修改密码")
    public Integer changePassword( @RequestBody Pwd pwd, HttpSession session){
        String username = (String) session.getAttribute("username");
        Integer status = userService.changePwd(username, pwd);
        if (status==603){
            //清除缓存
            session.removeAttribute("username");
        }
        return status;
    }

    /**
     * 上传文件大小这顶，以字节为单位，这里设定最大为1M
     */

    private static final long AVATAR_MAX_SIZE=1024*1024;
    /**
     * 上传文件的类型
     */

    private static final List<String> AVATAR_TYPE=new ArrayList<>();
    static {
        //当项目启动时就会运行，并且只会运行一次
        AVATAR_TYPE.add("image/jpg");
        AVATAR_TYPE.add("image/png");
        AVATAR_TYPE.add("image/gif");
        AVATAR_TYPE.add("image/jpeg");
        AVATAR_TYPE.add("image/bmp");
    }

    /**
     * 用户头像管理
     *
     * @return {@link Integer }
     * @author qionglan
     * @date 2024/06/14 09:49:14
     **/

    @RequestMapping("/changeAvatar")
    @ApiOperation("用户头像管理")
    public Integer changeAvatar( MultipartFile file, HttpSession session){
        //验证图片是否为空
        boolean empty = file.isEmpty();
        //isEmpty(),当检测到文件大小为0时，返回true
        //上传文件为空
        if (empty) {
            return 601;
        }
        //检查文件的大小
        long size = file.getSize();
        if (size>AVATAR_MAX_SIZE){
            //文件过大
            return 602;
        }
        String contentType = file.getContentType();
        System.err.println("文件后缀："+contentType);
        if (!AVATAR_TYPE.contains(contentType)){
            //文件类型不满足规定
            return 603;
        }
        //处理文件名（换个名字），保留原来的文件类型
        String filename = file.getOriginalFilename();
        //指定文件的存储地址
        //通过session指定路径
        String path = session.getServletContext().getRealPath("upload");
        //判定路径是否存在，不存在就创建一个
        File dir=new File(path);
        if (!dir.exists()){
            dir.mkdir();
        }
        //准备一个新的文件名
        String newFileName=""+System.currentTimeMillis()+ UUID.randomUUID();
        //获取后缀
        String suffix="";
        //lastIndexOf返回最后一个点所在的位置下标
        int index = filename.lastIndexOf(".");
        if (index>1){
            suffix=filename.substring(index);
        }
        //拼接新名字
        String endFileName = newFileName + suffix;
        //将文件保存在服务端
        File save=new File(path,endFileName);
        try {
            file.transferTo(save);
        } catch (IOException e) {
            e.printStackTrace();
            //文件写入时出现问题
            return 604;
        }  catch (IllegalStateException e){
            e.printStackTrace();
            //文件破损或损坏
            return 605;
        }
        //将文件的路径存入数据库
        String avatar="/upload/"+endFileName;
        System.out.println("文件路径："+path);
        //根据当前登录用户修改头像路径
        String username =(String) session.getAttribute("username");

        Integer result = userService.changeAvatar(username, avatar);
        if (result==701){
            //用户被封禁
            return 606;
        }
        if (result==702)
        {
            //数据库出问题
            return 607;
        }
        //成功
        return 608;
    }

    /**
     * 返回用户当前头像
     *
     * @param session 一场
     * @return {@link String }
     * @author qionglan
     * @date 2024/06/14 16:24:14
     **/

    @RequestMapping("/getAvatar")
    @ApiOperation("返回用户当前头像")
    public String getAvatar(HttpSession session){
        String username =(String) session.getAttribute("username");
        return userService.findAvatarByUsername(username);
    }

    @GetMapping("/selectByUsername")
    public Resp<User> selectByUsername(HttpSession session){
        String username = (String) session.getAttribute("username");

        //System.out.println("username:"+username);

        User user = userService.selectByUsername(username);

        //System.out.println("user:"+user);

        return Resp.success(user);
    }
    @PostMapping("/updateUserByUsername")
    public Resp<UpdateUserDto> updateUserByUsername( @RequestBody UpdateUserDto userDto){

        boolean flag = userService.updateUserByUsername(userDto);

        if (!flag){

            return Resp.failed("修改个人信息失败，请联系管理员");
        }

        return Resp.success(userDto);
    }

    @ApiOperation("分页查询数据")
    @GetMapping("/selectByPage")
    public ResponseData selectByPage( String username, Integer page, Integer pageSize){

        List<User> users = userService.selectByPage(username, page, pageSize);
        if (users==null){
            return new ResponseData(ResponseCode.NULL_DATA);
        }

        long count = userService.count(username);

        return new ResponseData(ResponseCode.SUCCESS,users,count);
    }

    @ApiOperation("添加用户")
    @PostMapping("/addUser")
    public ResponseData addUser(@RequestBody User user){
        User userByName = userService.selectByUsername(user.getUsername());

        //用户名已存在
        if (userByName!=null) {
            return new ResponseData(ResponseCode.ADD_FAILED);
        }

        String salt= String.valueOf(UUID.randomUUID());
        user.setSalt(salt);

        String initPass="123456";

        if (user.getPassword()==null){

            user.setPassword(initPass);
        }

        //密码MD5加密加盐
        user.setPassword(Md5Utils.md5ByPassword(salt,user.getPassword()));

        user.setCreatedTime(new Date());
        user.setIsDelete(0);
        user.setGender(1);
        user.setModifiedTime(new Date());

        boolean flag = userService.insertUser(user);

        if (!flag) {

            return new ResponseData(ResponseCode.ADD_FAILED);
        }

        return new ResponseData(ResponseCode.SUCCESS,user);
    }

    @ApiOperation("通过主键删除数据")
    @PostMapping("/delete")
    public ResponseData deleteById(Integer uid){

        if (!userService.deleteById(uid)){
            return new ResponseData(ResponseCode.DELETE_FAILED);
        }

        long count = userService.count(null);

        return new ResponseData(ResponseCode.SUCCESS,"success",count);
    }

    @ApiOperation("通过主键修改数据")
    @PostMapping("/update")
    public ResponseData update(@RequestBody User user){

        if (!userService.updateUser(user)){
            return new ResponseData(ResponseCode.DELETE_FAILED);
        }

        long count = userService.count(null);
        return new ResponseData(ResponseCode.SUCCESS,"success",count);
    }

    @ApiOperation("退出登录")
    @PostMapping("/logout")
    public ResponseData logout(HttpSession session) {
        // 清除 session 中的用户信息，并完成注销
        session.removeAttribute("username");

        return new ResponseData(ResponseCode.SUCCESS);
    }

}
